<!DOCTYPE html>
<html lang="zh-cn" itemscope itemtype="http://schema.org/WebPage">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>友知弄</title>
  

<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>

<meta name="MobileOptimized" content="width"/>
<meta name="HandheldFriendly" content="true"/>


<meta name="applicable-device" content="pc,mobile">

<meta name="theme-color" content="#f8f5ec" />
<meta name="msapplication-navbutton-color" content="#f8f5ec">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="#f8f5ec">

<meta name="mobile-web-app-capable" content="yes">

<meta name="author" content="yixy" />
  <meta name="description" content="YOUZHILANE" />
  <meta name="keywords" content="essay, notes" />






<meta name="generator" content="Hugo 0.56.1" />


<link rel="canonical" href="https://yixy.github.io/youzhilane/" />
<link href="%7balternate%20%7bRSS%20application/rss&#43;xml%20%20index%20alternate%20%20false%20false%20true%20false%20false%200%7d%20/youzhilane/index.xml%20https://yixy.github.io/youzhilane/index.xml%7d" rel="alternate" type="application/rss+xml" title="友知弄" />



<link rel="icon" href="/youzhilane/favicon.ico" />











<link rel="stylesheet" href="/youzhilane/sass/jane.min.af20b78e95c84de86b00a0242a4a77bd2601700e1b250edf27537d957ac0041d.css" integrity="sha256-ryC3jpXITehrAKAkKkp3vSYBcA4bJQ7fJ1N9lXrABB0=" media="screen" crossorigin="anonymous">





<meta property="og:title" content="友知弄" />
<meta property="og:description" content="YOUZHILANE" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://yixy.github.io/youzhilane/" />

<meta property="og:updated_time" content="2019-11-17T00:22:22+08:00" />
<meta itemprop="name" content="友知弄">
<meta itemprop="description" content="YOUZHILANE">

<meta name="twitter:card" content="summary"/>
<meta name="twitter:title" content="友知弄"/>
<meta name="twitter:description" content="YOUZHILANE"/>

<!--[if lte IE 9]>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/classlist/1.1.20170427/classList.min.js"></script>
<![endif]-->

<!--[if lt IE 9]>
  <script src="https://cdn.jsdelivr.net/npm/html5shiv@3.7.3/dist/html5shiv.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/respond.js@1.4.2/dest/respond.min.js"></script>
<![endif]-->




</head>
<body>
  <div id="mobile-navbar" class="mobile-navbar">
  <div class="mobile-header-logo">
    <a href="/youzhilane/" class="logo">友知弄</a>
  </div>
  <div class="mobile-navbar-icon">
    <span></span>
    <span></span>
    <span></span>
  </div>
</div>
<nav id="mobile-menu" class="mobile-menu slideout-menu">
  <ul class="mobile-menu-list">
    <li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/">主页</a>
          
        
      </li><li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/categories/">分类</a>
          
        
      </li><li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/booklist/">书单</a>
          
        
      </li><li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/about/">关于友知弄</a>
          
        
      </li><li class="mobile-menu-item">
        
          
          
            <a class="menu-item-link" href="https://github.com/yixy" rel="noopener" target="_blank">
              GitHub
              
              <i class="iconfont">
                <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="18" height="18">
  <path d="M623.36 272.96 473.216 423.04C467.2 429.056 467.072 438.656 472.896 444.416c0 0-6.72-6.656 1.6 1.6C496.064 467.648 528.64 500.224 528.64 500.224 534.464 506.048 544 505.856 550.016 499.904l150.08-150.144 67.328 66.432c9.024 8.96 27.456 4.544 30.4-8.96 19.968-92.608 46.656-227.52 46.656-227.52 6.848-34.496-16.192-56.704-49.92-49.92 0 0-134.656 26.816-227.328 46.784C560.32 178.048 556.352 182.272 554.752 187.136c-3.2 6.208-3.008 14.208 3.776 20.992L623.36 272.96z"></path>
  <path d="M841.152 457.152c-30.528 0-54.784 24.512-54.784 54.656l0 274.752L237.696 786.56 237.696 237.696l206.016 0c6.656 0 10.752 0 13.248 0C487.68 237.696 512 213.184 512 182.848 512 152.32 487.36 128 456.96 128L183.04 128C153.216 128 128 152.576 128 182.848c0 3.136 0.256 6.272 0.768 9.28C128.256 195.136 128 198.272 128 201.408l0 639.488c0 0.064 0 0.192 0 0.256 0 0.128 0 0.192 0 0.32 0 30.528 24.512 54.784 54.784 54.784l646.976 0c6.592 0 9.728 0 11.712 0 28.736 0 52.928-22.976 54.464-51.968C896 843.264 896 842.304 896 841.344l0-20.352L896 561.408 896 512.128C896 481.792 871.424 457.152 841.152 457.152z"></path>
</svg>

              </i>
            </a>
          
        
      </li><li class="mobile-menu-item">
        
          
          <div class="mobile-menu-parent">
            <span class="mobile-submenu-open"></span>
            <a href="https://yixy.github.io/youzhilane/post/">
              归档
            </a>
          </div>
          <ul class="mobile-submenu-list">
            
              <li>
                <a href="https://yixy.github.io/youzhilane/post/">日期</a>
              </li>
            
              <li>
                <a href="https://yixy.github.io/youzhilane/tags/">标签</a>
              </li>
            
          </ul>
        
      </li>
    

    
  </ul>
</nav>


  
    






  <link rel="stylesheet" href="/youzhilane/lib/photoswipe/photoswipe.min.css" />
  <link rel="stylesheet" href="/youzhilane/lib/photoswipe/default-skin/default-skin.min.css" />




<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

<div class="pswp__bg"></div>

<div class="pswp__scroll-wrap">
    
    <div class="pswp__container">
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
      <div class="pswp__item"></div>
    </div>
    
    <div class="pswp__ui pswp__ui--hidden">
    <div class="pswp__top-bar">
      
      <div class="pswp__counter"></div>
      <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
      <button class="pswp__button pswp__button--share" title="Share"></button>
      <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
      <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
      
      
      <div class="pswp__preloader">
        <div class="pswp__preloader__icn">
          <div class="pswp__preloader__cut">
            <div class="pswp__preloader__donut"></div>
          </div>
        </div>
      </div>
    </div>
    <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
      <div class="pswp__share-tooltip"></div>
    </div>
    <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
    </button>
    <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
    </button>
    <div class="pswp__caption">
      <div class="pswp__caption__center"></div>
    </div>
    </div>
    </div>
</div>

  

  

  

  <header id="header" class="header container">
    <div class="logo-wrapper">
  <a href="/youzhilane/" class="logo">
    
      友知弄
    
  </a>
</div>

<nav class="site-navbar">
  <ul id="menu" class="menu">
    
    
        <li class="menu-item active">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/">主页</a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/categories/">分类</a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/booklist/">书单</a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://yixy.github.io/youzhilane/about/">关于友知弄</a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          
            <a class="menu-item-link" href="https://github.com/yixy" rel="noopener" target="_blank">
              GitHub
              
              <i class="iconfont">
                <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="18" height="18">
  <path d="M623.36 272.96 473.216 423.04C467.2 429.056 467.072 438.656 472.896 444.416c0 0-6.72-6.656 1.6 1.6C496.064 467.648 528.64 500.224 528.64 500.224 534.464 506.048 544 505.856 550.016 499.904l150.08-150.144 67.328 66.432c9.024 8.96 27.456 4.544 30.4-8.96 19.968-92.608 46.656-227.52 46.656-227.52 6.848-34.496-16.192-56.704-49.92-49.92 0 0-134.656 26.816-227.328 46.784C560.32 178.048 556.352 182.272 554.752 187.136c-3.2 6.208-3.008 14.208 3.776 20.992L623.36 272.96z"></path>
  <path d="M841.152 457.152c-30.528 0-54.784 24.512-54.784 54.656l0 274.752L237.696 786.56 237.696 237.696l206.016 0c6.656 0 10.752 0 13.248 0C487.68 237.696 512 213.184 512 182.848 512 152.32 487.36 128 456.96 128L183.04 128C153.216 128 128 152.576 128 182.848c0 3.136 0.256 6.272 0.768 9.28C128.256 195.136 128 198.272 128 201.408l0 639.488c0 0.064 0 0.192 0 0.256 0 0.128 0 0.192 0 0.32 0 30.528 24.512 54.784 54.784 54.784l646.976 0c6.592 0 9.728 0 11.712 0 28.736 0 52.928-22.976 54.464-51.968C896 843.264 896 842.304 896 841.344l0-20.352L896 561.408 896 512.128C896 481.792 871.424 457.152 841.152 457.152z"></path>
</svg>

              </i>
            </a>
          

        

      </li>
    
        <li class="menu-item">
        
          
          <a class="menu-item-link menu-parent" href="https://yixy.github.io/youzhilane/post/">归档</a>
          <ul class="submenu">
            
              <li>
                <a href="https://yixy.github.io/youzhilane/post/">日期</a>
              </li>
            
              <li>
                <a href="https://yixy.github.io/youzhilane/tags/">标签</a>
              </li>
            
          </ul>

        

      </li>
    

    
    

    
  </ul>
</nav>

  </header>

  <div id="mobile-panel">
    <main id="main" class="main bg-llight">
      <div class="content-wrapper">
        <div id="content" class="content container">
          
<section id="posts" class="posts">
  
  
    
  
  
  
    <article class="post bg-white">
  <header class="post-header">
    <h1 class="post-title">
      
      <a class="post-link" href="/youzhilane/post/06%E4%BA%91%E8%AE%A1%E7%AE%97/go%E8%AF%AD%E8%A8%80/go%E7%AC%94%E8%AE%B0-%E5%B9%B6%E5%8F%91%E6%94%AF%E6%8C%81select/">Go笔记-并发支持(select)</a>
    </h1>
    
    <div class="post-meta">
      <time datetime="2019-06-25" class="post-time">
        2019-06-25
      </time>
      <div class="post-category">
          <a href="https://yixy.github.io/youzhilane/categories/%E4%BA%91%E8%AE%A1%E7%AE%97/"> 云计算 </a>
          
        </div>
      <span class="more-meta"> 约 2110 字 </span>
      <span class="more-meta"> 预计阅读 5 分钟 </span>
      
      
      
    </div>
  </header>
  
  <div class="post-content">
    
    <div class="post-summary">
      候选分支、默认分支与select的行为 Golang在语言级别支持select关键字。select用来监控一系列的文件句柄，一旦其中有一个文件
    </div>
    <div class="read-more">
      <a href="/youzhilane/post/06%E4%BA%91%E8%AE%A1%E7%AE%97/go%E8%AF%AD%E8%A8%80/go%E7%AC%94%E8%AE%B0-%E5%B9%B6%E5%8F%91%E6%94%AF%E6%8C%81select/" class="read-more-link">阅读全文</a>
    </div>
    
  </div>
</article>

  
    <article class="post bg-white">
  <header class="post-header">
    <h1 class="post-title">
      
      <a class="post-link" href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B01%E7%8E%B0%E4%BB%A3%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0/"></a>
    </h1>
    
    <div class="post-meta">
      <time datetime="0001-01-01" class="post-time">
        0001-01-01
      </time>
      
      <span class="more-meta"> 约 44 字 </span>
      <span class="more-meta"> 预计阅读 1 分钟 </span>
      
      
      
    </div>
  </header>
  
  <div class="post-content">
    
    <div class="post-summary">
      OS笔记(1)——现代操作系统概述 1. 什么是操作系统 计算机系统可分为硬件系统和软件系统。操作系统是运行在硬件系统上的一层计算机软件，它为用户提供一个简单清晰的计算机模型，并负责管理计算机硬件设备。
操作系统位于裸机之上，为所有其它软件提供基础的运行环境。
操作系统所处的位置如下图所示：
多数计算机有两种运行模式，计算机软件分别运行在这两种模式下，通常OS运行在内核态、其它软件运行在用户态。
 内核态：具有对硬件的完全访问权，可以执行机器能够运行的任何指令。 用户态：只能执行机器指令中的一个子集。  注意1：这里所说的操作系统是狭义的，即指操作系统内核。在很多语境下，广义上的操作系统概念可能还会涵盖了一些其它不属于内核的部分。
注意2：许多系统中，存在一些用户态下运行的程序协助内核完成特权功能。这些在内核外运行的程序也被有争议地被认为是操作系统的一部分，或者至少与操作系统密切相关。
2. 操作系统的作用 其实前面已经提到了操作系统的作用，这里再总结一下：
 为用户（应用程序员，实际上是应用程序）提供一个资源集的清晰抽象。 管理计算机硬件资源。  操作系统中的进程/线程、虚拟地址空间、文件，分别可以看作是对CPU、内存、IO的抽象。
3. 操作系统历史 一个粗略的操作系统发展历史描述如下：
 无操作系统：真空管计算机与手工操作（1945-1955），人们使用插拔电缆和使用穿孔卡片的方式控制机器的基本功能。 单道批处理系统：晶体管计算机与脱机IO、批处理技术（1955-1965），人们使用外围设备将输入读入磁带，操作员在主机上装入一个特殊的程序（现代OS前身），它从磁带上读取一个作业并运行。当一个作业完全结束后，操作员取下输入磁带和输出磁带，继续换取下一批作业进行处理。完成作业的输出磁带被拿到外围设备上进行脱机打印。 多道批处理系统：集成电路芯片和多道程序设计（1965-）。同时把几个作业放入内存，并允许他们交替执行，以减少昂贵的CPU空闲时间浪费。 现代操作系统：超大规模集成电路和现代操作系统。批处理、分时、实时、分布式等各类操作系统并存发展。  4. 现代操作系统的主要功能  处理机管理功能：使用进程抽象模型，实现进程控制、通信、调度等机制。 内存管理功能：使用地址空间抽象模型，实现内存管理与保护。 文件管理功能：现代计算机系统中，程序和数据总是存储在磁盘上以供使用，操作系统使用文件抽象模型对磁盘进行管理。 设备管理功能：提供外围IO设备的抽象和管理功能。 系统调用接口：提供一组系统调用，这些接口是为用户程序访问系统资源而设置的。CLI（Command Line Interface）和GUI（Graph User Interface）是在系统调用之上构建的，不过他们通常不运行在内核态。  5. 操作系统结构  单体系统（单内核）：整个OS以国产集合的方式编写，链接成一个大型可执行二进制程序。 微内核：将OS划分成小的、良好定义的模块。只有其中一个模块——微内核，运行在内核态；其余模块，由于功能相对弱些，则作为普通用户进程运行。这样提高了内核的稳定性。  6. 延伸阅读 多媒体操作系统，可参考《现代操作系统》(Tanenbaum)。
《性能之巅》第三章 操作系统
    </div>
    <div class="read-more">
      <a href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B01%E7%8E%B0%E4%BB%A3%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0/" class="read-more-link">阅读全文</a>
    </div>
    
  </div>
</article>

  
    <article class="post bg-white">
  <header class="post-header">
    <h1 class="post-title">
      
      <a class="post-link" href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B02%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B/"></a>
    </h1>
    
    <div class="post-meta">
      <time datetime="0001-01-01" class="post-time">
        0001-01-01
      </time>
      
      <span class="more-meta"> 约 44 字 </span>
      <span class="more-meta"> 预计阅读 1 分钟 </span>
      
      
      
    </div>
  </header>
  
  <div class="post-content">
    
    <div class="post-summary">
      OS笔记(2)——进程与线程 1. 进程模型及其意义 进程（process）是对正在运行程序的一个抽象。一个进程是某个程序的一个实例。一个程序如果被执行了两遍，则算作两个进程。
某个瞬间，一个CPU只能运行一个进程。在任何多道程序设计系统中，CPU总是由一个进程快速切换至另一个进程，以此来实现并发。所以说，实际上进程的概念其实也是对CPU的一种抽象。
 concurrent：并发，多个事件在同一时间间隔内发生。 parallel：并行，多个事件在同一时刻发生。  人们很难对CPU的多个并发活动切换进行跟踪，因此操作系统设计者发展了用于描述这一概念的模型（顺序进程集），使其更容易理解和处理。
2. 进程的状态 进程有四种状态。
 运行态：该时刻进程实际占用CPU。 就绪态：可运行，但是当前没有可用CPU。可能是刚由阻塞恢复，或者由内核调度CPU被占用而不能运行。 阻塞态：逻辑上不能运行，让出CPU，例如等待IO。 终止态：进程运行完毕，出错退出，或被其它进程杀死。  3. 进程的实现  进程有自己的地址空间，用于存放有可执行程序、数据、堆栈。 进程除地址空间以外的信息都存放在内核的进程表中，每个进程占用一个表项，包含寄存器（包含程序计数器和堆栈指针等），打开文件清单，内存分配状况，账号和调度信息，以及其它信息。  4. 线程模型及其意义 线程与进程的区别在于，线程共享地址空间，另外，线程保有自己的堆栈信息。
线程模型的意义在于：
 对于某些应用而言，并发实体共享一个地址空间和所有可用数据的能力是必须的，而多进程模型无法表达。 线程比进程更轻量级，它们比进程更容易（即更快）创建，也更容易销毁。在许多系统中，创建一个线程比创建一个进程要快10到100倍。但是注意，线程切换和进程切换的开销应该是差不多的。 对于IO密集型的应用，多线程允许任务彼此重叠执行，从而加快整个应用的执行速度。 在多CPU系统中，真正的并行有了实现的可能。  不支持多线程的操作系统，其进程可以看作是只有一个线程的进程。
进程是cpu资源分配的最小单位，线程是cpu调度的最小单位。
5. 协程：用户级线程 通常说的多线程指内核级多线程，操作系统对线程是有感知的，内核中会维护线程表。内核级线程特点如下：
 内核级线程切换，需要在用户态和内核态之间切换，开销比较大。 （如上节所说，）内核级线程能够充分利用多处理机的并行能力。  在操作系统不支持线程的情况下，可以在用户空间自行实现线程，此时内核对于用户级线程（协程）是没有感知的，每个进程需要自己维护自己的线程表记录线程信息，并自行实现调度机制。用户级线程特点如下：
 允许进程有自己定制的调度算法。 本地阻塞时，用户级线程切换，不需要在用户态和内核态之间切换，开销小很多。 系统阻塞时，当前进程会被阻塞。可以使用同步非阻塞IO和IO多路复用技术解决，但是实现复杂。对于内存缺页等场景进程仍会被阻塞，尽管其它进程可能仍可以运行。 在一个进程内部，没有时钟中断，所以不可能用轮转调度方式调度用户级线程。此时，用户级线程运行是非抢占式的。可以考虑让运行时系统请求每秒一次的时钟信号（中断）来实现，但是开销会很大。 用户级线程并不能够充分利用多处理机的并行能力。  将内核级线程与用户级线程混合使用，可以将两者的优点结合起来。一些应用框架或者程序设计语言就采用了类似的思路，比如，Golang就原生支持了这样的方式。
6. 参考 《现代操作系统》，Tanenbaum
    </div>
    <div class="read-more">
      <a href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B02%E8%BF%9B%E7%A8%8B%E4%B8%8E%E7%BA%BF%E7%A8%8B/" class="read-more-link">阅读全文</a>
    </div>
    
  </div>
</article>

  
    <article class="post bg-white">
  <header class="post-header">
    <h1 class="post-title">
      
      <a class="post-link" href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B03%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/"></a>
    </h1>
    
    <div class="post-meta">
      <time datetime="0001-01-01" class="post-time">
        0001-01-01
      </time>
      
      <span class="more-meta"> 约 157 字 </span>
      <span class="more-meta"> 预计阅读 1 分钟 </span>
      
      
      
    </div>
  </header>
  
  <div class="post-content">
    
    <div class="post-summary">
      OS笔记(3)——进程间通信 进程间通信（IPC，Inter Process Communication）的问题和解决方法，同样适用于线程，下面不再单独讨论线程。
但是需要注意的是基于共享变量的通信方式（忙等待、信号量等）通常是应用在线程间通信的（因为进程并不共享地址空间），进程间通信一般使用消息传递机制。
1. IPC面临的问题 IPC需要解决以下三个问题：
 通信：一个进程如何向其它进程传递消息。 互斥：确保多个进程在关键活动中互斥（不会出现交叉执行）。 同步：确保多个进程执行保持一定的顺序（保证某种事件的顺序发生或不发生）。  一些概念：
 竞争条件（race condition）：多个进程读写某些共享数据，而最后的结果取决于进程运行的精确时序，这称为竞争条件。 临界区（critical region/section）：对共享内存进行访问的程序片段被称为临界区。 原子操作：指一组相关联的操作要么都不间断地执行，要么都不执行。  2. 忙等待的互斥 本节讨论几种实现互斥的方案。这些方法本质上是这样的：当一个进程想进入临界区，先检查是否允许进入，若不允许，则该进程将原地等待，直到允许为止。
屏蔽中断
在单处理器系统中，最简单的方法是使每个进程刚刚进入临界区后立即屏蔽所有其它中断，并在离开之前再打开中断。这也做的原因是CPU只有发生时钟中断或其它中断时才会进行进程切换。
严格轮转法
采用软件方式，使进程严格地轮流进入它们的临界区。常用的方式是采用忙等待一直扫描，直到检测到预期的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  //进程0 for{ for turn!=0{ //临界区 } turn=1 } //进程1 for{ for turn!=1{ //临界区 } turn=0 }   Peterson算法
通过将锁和警告变量的思想相结合，提出的一个不需要严格轮转的软件互斥算法。
1 2 3 4 5 6 7 8 9 10  void enter_region(int process){ //进程号，0或1 int other = 1- process //其它进程号 interest[process]=true turn=process for turn==process &amp;&amp; interest[other]==true {} } void leave_region(int process){ interest[process]=false }   TSL或XCHG指令
    </div>
    <div class="read-more">
      <a href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B03%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/" class="read-more-link">阅读全文</a>
    </div>
    
  </div>
</article>

  
    <article class="post bg-white">
  <header class="post-header">
    <h1 class="post-title">
      
      <a class="post-link" href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B04%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95/"></a>
    </h1>
    
    <div class="post-meta">
      <time datetime="0001-01-01" class="post-time">
        0001-01-01
      </time>
      
      <span class="more-meta"> 约 26 字 </span>
      <span class="more-meta"> 预计阅读 1 分钟 </span>
      
      
      
    </div>
  </header>
  
  <div class="post-content">
    
    <div class="post-summary">
      OS笔记(4)——进程调度算法 对于单处理机多道程序设计系统来说，只有一个CPU，如果同时出现两个进程/线程处于就绪状态，那么此时需要选择下一个要执行的进程。在操作系统中，完成这项工作的调度程序所使用的算法被称为调度算法。实际上，调度算法的应用随处可见，进程调度算法同样适用于线程。
一般而言，公平（等价进程获得公平的CPU份额）和平衡（保持系统所有部分都忙碌）是调度算法所需要追求的。但是，对于不同特点的系统，还会有一些特定的目标。
 批处理系统：吞吐量高、周转时间小（作业从开始到完成的平均时间）。 交互式系统：响应时间小。 实时系统：满足截止时间。  1. 先来先服务 维持一个队列，先到来的进程最先被调度。一个运行中的进程如果进入阻塞，则被重新插入队尾。
这是一个非抢占式调度算法。
2. 最短剩余时间优先 当运行时间可以预先知道时，优先调度运行时间最短的进程。
这是一个非抢占式调度算法。他的抢占式版本对算法进行了一些改造：新来的进程比当前运行进程的剩余执行时间更少时，当前进程阻塞，新进程被调度。
3. 轮转调度 维持一个队列，队列中每个进程按顺序获得一个时间片，运行进程在该时间片内运行。若进程在时间片结束时还在运行，则剥夺其CPU分配给下一个进程。通常，时间片的设置是20ms-50ms。
这是一个抢占式调度算法。
4. 优先级调度 给每个进程分配优先级，保证高优先级的进程先被调度。注意，这里的优先级可以是静态也可以是动态调整的。为了防止饥饿进程的出现，通常会给运行中的进程分配一定的时间片，用完时间片后，可以调低该进程的优先级。
优先级调度算法通常是一个抢占式调度算法。
5. 彩票调度 给每个进程分配一个“彩票”，一旦需要作出一项调度策略时，系统随机抽出一张彩票，拥有该彩票的进程获得一定时间片的调度资源。注意，可以通过给更重要的进程分配额外数量的彩票，来实现优先级策略。
彩票调度算法通常是一个抢占式调度算法。
    </div>
    <div class="read-more">
      <a href="/youzhilane/post/01%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/os%E7%AC%94%E8%AE%B04%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95/" class="read-more-link">阅读全文</a>
    </div>
    
  </div>
</article>

  
</section>






  
  
  

  
  

  
  

  
  

  
  

    <nav class="pagination">
      <ul>

      
      
      <li><a href="/youzhilane/">««</a></li>
      

      
      
      <li><a href="/youzhilane/page/6/">«</a></li>
      

      
      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/">
              1
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/2/">
              2
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/3/">
              3
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/4/">
              4
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/5/">
              5
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/6/">
              6
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="active">
            <a href="/youzhilane/page/7/">
              7
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/8/">
              8
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/9/">
              9
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/10/">
              10
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/11/">
              11
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/12/">
              12
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            
              
            

          
          
          

        
        

        
        
          <li class="">
            <a href="/youzhilane/page/13/">
              13
            </a>
          </li>
        

      

        

        
        

          
          
          

            
            

          
          
          

        
        

        
        

      

        

        
        

          
          
          

            
            

          
          
          

        
        

        
        

      

        

        
        

          
          
          

            
            

          
          
          

        
        

        
        

      

        

        
        

          
          
          

            
            

          
          
          

        
        

        
        

      

        

        
        

          
          
          

            
            

          
          
          

        
        

        
        

      

        

        
        

          
          
          

            
            

          
          
          

        
        

        
        

      

      
      
      <li><a href="/youzhilane/page/8/">»</a></li>
      

      
      
      <li><a href="/youzhilane/page/19/">»»</a></li>
      

      </ul>
    </nav>
  





        </div>
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="icon-links">
  
  
    <a href="mailto:youzhilane01@gmail.com" rel="me noopener" class="iconfont"
      title="email" >
      <svg class="icon" viewBox="0 0 1451 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="36" height="36">
  <path d="M664.781909 681.472759 0 97.881301C0 3.997201 71.046997 0 71.046997 0L474.477909 0 961.649408 0 1361.641813 0C1361.641813 0 1432.688811 3.997201 1432.688811 97.881301L771.345323 681.472759C771.345323 681.472759 764.482731 685.154773 753.594283 688.65053L753.594283 688.664858C741.602731 693.493018 729.424896 695.068979 718.077952 694.839748 706.731093 695.068979 694.553173 693.493018 682.561621 688.664858L682.561621 688.65053C671.644501 685.140446 664.781909 681.472759 664.781909 681.472759L664.781909 681.472759ZM718.063616 811.603883C693.779541 811.016482 658.879232 802.205449 619.10784 767.734955 542.989056 701.759633 0 212.052267 0 212.052267L0 942.809523C0 942.809523 0 1024 83.726336 1024L682.532949 1024 753.579947 1024 1348.948139 1024C1432.688811 1024 1432.688811 942.809523 1432.688811 942.809523L1432.688811 212.052267C1432.688811 212.052267 893.138176 701.759633 817.019477 767.734955 777.248 802.205449 742.347691 811.03081 718.063616 811.603883L718.063616 811.603883Z"></path>
</svg>

    </a>


<a href="https://yixy.github.io/youzhilane/index.xml" rel="noopener alternate" type="application/rss&#43;xml"
    class="iconfont" title="rss" target="_blank">
    <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="30" height="30">
  <path d="M819.157333 1024C819.157333 574.592 449.408 204.8 0 204.8V0c561.706667 0 1024 462.293333 1024 1024h-204.842667zM140.416 743.04a140.8 140.8 0 0 1 140.501333 140.586667A140.928 140.928 0 0 1 140.074667 1024C62.72 1024 0 961.109333 0 883.626667s62.933333-140.544 140.416-140.586667zM678.784 1024h-199.04c0-263.210667-216.533333-479.786667-479.744-479.786667V345.173333c372.352 0 678.784 306.517333 678.784 678.826667z"></path>
</svg>

  </a>
   
</div>

<div class="copyright">
  <span class="power-by">
    Powered by <a class="hexo-link" href="https://gohugo.io">Hugo</a>
  </span>
  <span class="division">|</span>
  <span class="theme-info">
    Theme - <a class="theme-link" href="https://github.com/xianmin/hugo-theme-jane">Jane</a>
  </span>

  <span class="copyright-year">
    &copy;
    2019
    <span class="heart">
      
      <i class="iconfont">
        <svg class="icon" viewBox="0 0 1025 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="14" height="14">
  <path d="M1000.1 247.9c-15.5-37.3-37.6-70.6-65.7-98.9-54.4-54.8-125.8-85-201-85-85.7 0-166 39-221.4 107.4C456.6 103 376.3 64 290.6 64c-75.1 0-146.5 30.4-201.1 85.6-28.2 28.5-50.4 61.9-65.8 99.3-16 38.8-24 79.9-23.6 122.2 0.7 91.7 40.1 177.2 108.1 234.8 3.1 2.6 6 5.1 8.9 7.8 14.9 13.4 58 52.8 112.6 102.7 93.5 85.5 209.9 191.9 257.5 234.2 7 6.1 15.8 9.5 24.9 9.5 9.2 0 18.1-3.4 24.9-9.5 34.5-30.7 105.8-95.9 181.4-165 74.2-67.8 150.9-138 195.8-178.2 69.5-57.9 109.6-144.4 109.9-237.3 0.1-42.5-8-83.6-24-122.2z"
   fill="#8a8a8a"></path>
</svg>

      </i>
    </span><span class="author">
        yixy
        
      </span></span>

  
  

  
</div>

    </footer>

    <div class="back-to-top" id="back-to-top">
      <i class="iconfont">
        
        <svg class="icon" viewBox="0 0 1024 1024" version="1.1"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
  width="35" height="35">
  <path d="M510.866688 227.694839 95.449397 629.218702l235.761562 0-2.057869 328.796468 362.40389 0L691.55698 628.188232l241.942331-3.089361L510.866688 227.694839zM63.840492 63.962777l894.052392 0 0 131.813095L63.840492 195.775872 63.840492 63.962777 63.840492 63.962777zM63.840492 63.962777"></path>
</svg>

      </i>
    </div>
  </div>
  
<script type="text/javascript" src="/youzhilane/lib/jquery/jquery-3.2.1.min.js"></script>
  <script type="text/javascript" src="/youzhilane/lib/slideout/slideout-1.0.1.min.js"></script>




<script type="text/javascript" src="/youzhilane/js/main.638251f4230630f0335d8c6748e53a96f94b72670920b60c09a56fdc8bece214.js" integrity="sha256-Y4JR9CMGMPAzXYxnSOU6lvlLcmcJILYMCaVv3Ivs4hQ=" crossorigin="anonymous"></script>












  
    <script type="text/javascript" src="/youzhilane/js/load-photoswipe.js"></script>
    <script type="text/javascript" src="/youzhilane/lib/photoswipe/photoswipe.min.js"></script>
    <script type="text/javascript" src="/youzhilane/lib/photoswipe/photoswipe-ui-default.min.js"></script>
  















</body>
</html>
